package com.lagou.client;

import com.lagou.constant.Constant;
import com.lagou.model.Question;
import com.lagou.model.User;
import com.lagou.model.UserMessage;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

import static com.lagou.constant.Constant.showResult;

/**

 * TODO: 编程实现管理员系统界面绘制和相应功能的实现

 */
public class ClientManagerView {
    /**
     * 使用合成复用原则
     */
    private final ClientInitClose cic;

    /**
     * 通过构造方法实现成员变量的初始化
     *
     * @param cic 客户端初始化管理类的实例
     */
    public ClientManagerView(ClientInitClose cic) {
        this.cic = cic;
    }


    /**
     * 自定义成员方法实现管理员系统主界面的绘制
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    public void clientMainPage() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("\n\n\t    欢迎进入管理员系统");
            System.out.println("------------------------------------");
            System.out.print("   [1] 学员管理");
            System.out.println("     [2] 考题管理");
            System.out.println("   [0] 退出系统");
            System.out.println("------------------------------------");
            System.out.println("请输入要进入的管理界面编号：");
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    System.out.println("正在进入学员管理系统...");
                    clientUserManagerPage();
                    break;
                case 2:
                    System.out.println("正在进入考题管理系统...");
                    clientQuestionManagerPage();
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    return;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }
    }

    /**
     * 自定义成员方法实现学员管理界面的绘制
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientUserManagerPage() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("\n\n\t    欢迎进入学员管理系统");
            System.out.println("------------------------------------");
            System.out.print("   [1] 增加学员");
            System.out.println("     [2] 删除学员");
            System.out.print("   [3] 修改学员");
            System.out.println("     [4] 查找学员");
            System.out.println("   [0] 退出系统");
            System.out.println("------------------------------------");
            System.out.println("请输入要进行的操作编号：");
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    clientAddUser();
                    break;
                case 2:
                    clientDeleteUser();
                    break;
                case 3:
                    clientUpdateUser();
                    break;
                case 4:
                    clientGetUser();
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    return;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }
    }

    /**
     * 自定义成员方法实现客户端查询学员账户功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientGetUser() throws IOException, ClassNotFoundException {
        System.out.println("请输入要查询的学员账户名称：");
        String userName = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.GET_USER, new User(userName));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要查询的账户信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "查询到的学员账户信息：", "查询失败，没有该学员账户信息！");
        if (Constant.SUCCESS.equals(tum.getType())) {
            System.out.print(tum.getUser().show());
        }
    }

    /**
     * 自定义成员方法实现客户端修改学员账户功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientUpdateUser() throws IOException, ClassNotFoundException {
        System.out.println("请输入要修改的学员账户名称：");
        String userName = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的学员账户密码：");
        String password = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.UPDATE_USER, new User(userName, password));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要修改的账户信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "修改学员账户信息成功！", "修改失败，没有该学员账户信息！");
    }

    /**
     * 自定义成员方法实现客户端删除学员账户功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientDeleteUser() throws IOException, ClassNotFoundException {
        System.out.println("请输入要删除的学员账户名称：");
        String userName = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.DELETE_USER, new User(userName));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要删除的账户信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "删除学员账户信息成功！", "删除失败，没有该学员账户信息！");
    }

    /**
     * 自定义成员方法实现客户端增加学员账户功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientAddUser() throws IOException, ClassNotFoundException {
        System.out.println("请输入要增加的学员账户名称：");
        String userName = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.ADD_USER, new User(userName));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要增加的账户信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "新增学员账户信息成功！", "新增失败，该学员账户信息已存在！");
    }

    private void clientQuestionManagerPage() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("\n\n\t    欢迎进入考题管理系统");
            System.out.println("------------------------------------");
            System.out.print("   [1] 增加考题");
            System.out.println("     [2] 删除考题");
            System.out.print("   [3] 修改考题");
            System.out.println("     [4] 查询考题");
            System.out.print("   [5] 导入考题");
            System.out.println("     [0] 退出系统");
            System.out.println("------------------------------------");
            System.out.println("请输入要进行的操作编号：");
            int choose = ClientScanner.getScanner().nextInt();
            switch (choose) {
                case 1:
                    clientAddQuestion();
                    break;
                case 2:
                    clientDeleteQuestion();
                    break;
                case 3:
                    clientUpdateQuestion();
                    break;
                case 4:
                    clientGetQuestion();
                    break;
                case 5:
                    clientImportQuestion();
                    break;
                case 0:
                    System.out.println("正在退出系统...");
                    return;
                default:
                    System.out.println("输入错误，请重新选择！");
            }
        }
    }

    /**
     * 自定义成员方法实现导入考题的功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientImportQuestion() throws IOException, ClassNotFoundException {
        System.out.println("要导入的试题文件，内容样例：");
        System.out.println("第一行：这里是题目");
        System.out.println("第二行：这里是选项A");
        System.out.println("第三行：这里是选项B");
        System.out.println("第四行：这里是选项C");
        System.out.println("第五行：这里是选项D");
        System.out.println("第六行（正确答案，直接写选项即可）：D");
        System.out.println("第七行：第二题的题目");
        System.out.println("......");
        System.out.println("请输入要导入考题题文件地址：");
        String path = ClientScanner.getScanner().next();
        List<Question> questionList = getQuestionList(path);
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.IMPORT_QUESTION, questionList);
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要导入的考题信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "导入考题成功！", "导入考题失败！");
    }

    /**
     * 自定义成员方法实现将考题文件中的考题信息读取到List集合中
     *
     * @param path 考题文件路径
     * @return Question类型的List集合
     */
    private List<Question> getQuestionList(String path) throws IOException {
        // 1.创建BufferedReader类型的对象与指定文件关联
        BufferedReader br = new BufferedReader(new FileReader(path));
        // 创建一个Question类型的List集合用于存储读取的试题
        List<Question> questionList = new LinkedList<>();
        // 创建一个Question类型的引用变量记录每次读取的实体信息
        Question question = null;
        // 2.不断地从输入流中读取一行字符串并写入到输出流中
        System.out.println("正在读取考题文件...");
        String str;
        // 3.创建变量记录行号
        int line = 1;
        while ((str = br.readLine()) != null) {
            // 每六次一循环
            switch (line % 6) {
                case 1:
                    // 注意：因为加了序列化，所以要确保每次添加的都是新的试题对象
                    question = new Question();
                    // 第一行，题目
                    question.setTitle(str);
                    break;
                case 2:
                    // 第二行，选项A
                    question.setAnswerA(str);
                    break;
                case 3:
                    // 第三行，选项B
                    question.setAnswerB(str);
                    break;
                case 4:
                    // 第四行，选项C
                    question.setAnswerC(str);
                    break;
                case 5:
                    // 第五行，选项D
                    question.setAnswerD(str);
                    break;
                case 0:
                    // 第六行，答案
                    question.setAnswer(str);
                    // 每次读取完一道题的答案后就可以将该试题加入到试题集合中去了
                    questionList.add(question);
                    break;
                default:
                    System.out.println("读取失败！");
                    return null;
            }
            line++;
        }
        System.out.println("读取试题文件成功！");
        return questionList;
    }

    /**
     * 自定义成员方法实现客户端查询考题功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientGetQuestion() throws IOException, ClassNotFoundException {
        System.out.println("请输入要查询的考题题目：");
        String title = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.GET_QUESTION, new Question(title));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要查询的考题信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "查询到的考题信息：", "查询失败，没有该考题信息！");
        if (Constant.SUCCESS.equals(tum.getType())) {
            System.out.println(tum.getQuestion().showAll());
        }
    }

    /**
     * 自定义成员方法实现客户端修改考题功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientUpdateQuestion() throws IOException, ClassNotFoundException {
        System.out.println("请输入要修改的考题题目：");
        String title = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的考题选项A：");
        String answerA = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的考题选项B：");
        String answerB = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的考题选项C：");
        String answerC = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的考题选项D：");
        String answerD = ClientScanner.getScanner().next();
        System.out.println("请输入要修改的考题答案：");
        String answer = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.UPDATE_QUESTION, new Question(title, answerA, answerB, answerC, answerD, answer));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要修改的考题信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "修改考题信息成功！", "修改失败，没有该考题信息！");
    }

    /**
     * 自定义成员方法实现客户端删除学员账户功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientDeleteQuestion() throws IOException, ClassNotFoundException {
        System.out.println("请输入要删除的考题题目：");
        String title = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.DELETE_QUESTION, new Question(title));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要删除的考题信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "删除考题信息成功！", "删除失败，没有该考题信息！");
    }

    /**
     * 自定义成员方法实现客户端增加考题功能
     *
     * @throws IOException            IO异常
     * @throws ClassNotFoundException 类型找不到异常
     */
    private void clientAddQuestion() throws IOException, ClassNotFoundException {
        System.out.println("请输入要增加的考题题目：");
        String title = ClientScanner.getScanner().next();
        System.out.println("请输入要增加的考题选项A：");
        String answerA = ClientScanner.getScanner().next();
        System.out.println("请输入要增加的考题选项B：");
        String answerB = ClientScanner.getScanner().next();
        System.out.println("请输入要增加的考题选项C：");
        String answerC = ClientScanner.getScanner().next();
        System.out.println("请输入要增加的考题选项D：");
        String answerD = ClientScanner.getScanner().next();
        System.out.println("请输入要增加的考题答案：");
        String answer = ClientScanner.getScanner().next();
        // 封装消息并使用对象输出流发送给服务器
        UserMessage tum = new UserMessage(Constant.ADD_QUESTION, new Question(title, answerA, answerB, answerC, answerD, answer));
        cic.getOos().writeObject(tum);
        System.out.println("客户端发送要增加的考题信息！");
        // 接收服务器的处理结果并给出提示
        tum = (UserMessage) cic.getOis().readObject();
        showResult(tum, "新增考题信息成功！", "新增失败，该考题信息已存在！");
    }
}
